Carregamento dos Dados
# Ler arquivo csv
Vinhos <- read.csv2("BaseWine_Red_e_White2018.csv", row.names=1)
#mostrar as variáveis e alguns valores
str(Vinhos)
## 'data.frame': 6497 obs. of 13 variables:
## $ fixedacidity : num 6.6 6.7 10.6 5.4 6.7 6.8 6.6 7.2 5.1 6.2 ...
## $ volatileacidity : num 0.24 0.34 0.31 0.18 0.3 0.5 0.61 0.66 0.26 0.22 ...
## $ citricacid : num 0.35 0.43 0.49 0.24 0.44 0.11 0 0.33 0.33 0.2 ...
## $ residualsugar : num 7.7 1.6 2.2 4.8 18.8 ...
## $ chlorides : num 0.031 0.041 0.063 0.041 0.057 0.075 0.069 0.068 0.027 0.035 ...
## $ freesulfurdioxide : num 36 29 18 30 65 16 4 34 46 58 ...
## $ totalsulfurdioxide: num 135 114 40 113 224 49 8 102 113 184 ...
## $ density : num 0.994 0.99 0.998 0.994 1 ...
## $ pH : num 3.19 3.23 3.14 3.42 3.11 3.36 3.33 3.27 3.35 3.11 ...
## $ sulphates : num 0.37 0.44 0.51 0.4 0.53 0.79 0.37 0.78 0.43 0.53 ...
## $ alcohol : num 10.5 12.6 9.8 9.4 9.1 9.5 10.4 12.8 11.4 9 ...
## $ quality : int 5 6 6 6 5 5 4 6 7 6 ...
## $ Vinho : Factor w/ 2 levels "RED","WHITE": 2 2 1 2 2 1 1 1 2 2 ...
#mostra as variáveis
names(Vinhos)
## [1] "fixedacidity" "volatileacidity" "citricacid"
## [4] "residualsugar" "chlorides" "freesulfurdioxide"
## [7] "totalsulfurdioxide" "density" "pH"
## [10] "sulphates" "alcohol" "quality"
## [13] "Vinho"
Descrição das variáveis:
Fixed Acidity: Acidez contida no vinho
Volatile Acidity: Quantidade de ácido acético no vinho, valores altos podem levar o vinho a ter sabor desagradável de vinagre
Citric Acid: Encontrado em pouca quantidade, o ácido cítrico pode adicionar frescor e sabor ao vinho.
Residual Sugar: Quantidade de açucar restante após o término da fermentação. É raro encontrar vinhos com menos de 1 g/l e vinhos com valores maiores que 45 g/l são considerardos doces.
Chlorides: Quantidade de sal no vinho
Free Sulfur Dioxide: A forma livre de SO2 (dióxido de enxofre) existe em equilibrio entre SO2 molecular (como um gás dissolvido) e ions bissulfito. Evita o crescimento de micróbios e oxidação do vinho.
Total Sulfur Dioxide: Total de SO2 livres ou ligados. Em baixa concentração, o SO2 é praticamente imperceptível no vinho, mas em concentrações acima de 50 ppm, o dióxido de enxofre torna-se evidente no aroma e sabor do vinho
Density: A densidade do vinho depende do percentual de álcool e açúcar.
pH: Descreve se o vinho é básico (14) ou ácido (0). A maioria dos vinhos possuem pH entre 3 e 4
Sulphates: Aditivo que pode contribuir com os níveis de SO2, que age contra micróbios e oxidação
Alcohol: O percentual de álcool no vinho
Quality: Qualidade do vinho com pontuação de 0 a 10, sendo 10 muito bom e 0 de péssima qualidade
Vinho: Tipo do vinho: tinto (RED) ou branco (WHITE)
attach(Vinhos)
summary(Vinhos)
## fixedacidity volatileacidity citricacid residualsugar
## Min. : 3.800 Min. :0.0800 Min. :0.0000 Min. : 0.60
## 1st Qu.: 6.400 1st Qu.:0.2300 1st Qu.:0.2500 1st Qu.: 1.80
## Median : 7.000 Median :0.2900 Median :0.3100 Median : 3.00
## Mean : 7.215 Mean :0.3397 Mean :0.3186 Mean : 5.44
## 3rd Qu.: 7.700 3rd Qu.:0.4000 3rd Qu.:0.3900 3rd Qu.: 8.10
## Max. :15.900 Max. :1.5800 Max. :1.6600 Max. :45.80
## chlorides freesulfurdioxide totalsulfurdioxide density
## Min. :0.00900 Min. : 1.00 Min. : 6.0 Min. :0.9871
## 1st Qu.:0.03800 1st Qu.: 17.00 1st Qu.: 77.0 1st Qu.:0.9923
## Median :0.04700 Median : 29.00 Median :118.0 Median :0.9949
## Mean :0.05603 Mean : 30.53 Mean :115.7 Mean :0.9947
## 3rd Qu.:0.06500 3rd Qu.: 41.00 3rd Qu.:156.0 3rd Qu.:0.9970
## Max. :0.61100 Max. :289.00 Max. :440.0 Max. :1.0140
## pH sulphates alcohol quality
## Min. :2.720 Min. :0.2200 Min. : 0.9567 Min. :3.000
## 1st Qu.:3.110 1st Qu.:0.4300 1st Qu.: 9.5000 1st Qu.:5.000
## Median :3.210 Median :0.5100 Median :10.3000 Median :6.000
## Mean :3.219 Mean :0.5313 Mean :10.4862 Mean :5.818
## 3rd Qu.:3.320 3rd Qu.:0.6000 3rd Qu.:11.3000 3rd Qu.:6.000
## Max. :4.010 Max. :2.0000 Max. :14.9000 Max. :9.000
## Vinho
## RED :1599
## WHITE:4898
##
##
##
##
Analisando o sumário, nota-se potenciais outliers dados que os valores mínimos e máximos estão muito distantes dos quartis para as seguintes variáveis: fixedacidity, volatileacidity, citricacid, residualsugar, chlorides, freesulfurdioxide, totalsulfurdioxide, sulphates e alcohol
Além disso, há valores muito discrepantes:
table(as.factor(Vinhos$quality), Vinhos$Vinho, useNA = "ifany")
##
## RED WHITE
## 3 10 20
## 4 53 163
## 5 681 1457
## 6 638 2198
## 7 199 880
## 8 18 175
## 9 0 5
plot_ly (
as.data.frame.matrix ( table(as.factor(Vinhos$quality), Vinhos$Vinho) ),
x = c(3:9), y= ~RED, type = 'bar', name='Tinto') %>%
add_trace(y= ~WHITE, name='Branco') %>%
layout(barmode = 'group')
Analisando a quantidade de vinhos por tipo e por qualidade, há mais vinhos do tipo branco do que tinto no data set. Também nota-se que ambos vinhos seguem uma tendência normal com relação à qualidade.
describe(Vinhos %>% filter(Vinho=="RED")) %>% select("Mínima"=min, "Máxima"=max, "Média"=mean, "Desvio Padrão"=sd, "Mediana"=median) -> estatTinto
estatTinto
describe(Vinhos %>% filter(Vinho=="WHITE")) %>% select("Mínima"=min, "Máxima"=max, "Média"=mean, "Desvio Padrão"=sd, "Mediana"=median) -> estatBranco
estatBranco
estatRazao <- estatTinto / estatBranco
estatRazao
Comparando-se os atributos dos vinhos tintos com os vinhos brancos de forma tabular através da observação dos parâmetros de máximo, mínimo, média, desvio padrão e mediana da amostra. Temos:
Para as outras características há diferenças significativas nos parâmetros entre 20% a quase 500%
Antes de qualquer conclusão, deve-se tratar as questões do outliers e valores faltantes que podem estar influenciando esta amostra.
#seleciona os vinhos com citricacid zerado
vinhosComZero <- which(Vinhos$citricacid == 0)
print(vinhosComZero)
## [1] 7 17 29 32 35 55 74 155 182 189 235 284 295 308
## [15] 328 336 436 470 618 628 824 882 884 918 979 1012 1061 1079
## [29] 1141 1187 1212 1222 1237 1244 1425 1608 1699 1700 1757 1812 1834 1836
## [43] 1850 1875 1895 1898 1906 1956 2239 2315 2402 2442 2451 2471 2489 2566
## [57] 2578 2652 2668 2724 2843 2878 2902 2906 2921 2966 3002 3078 3117 3220
## [71] 3261 3262 3300 3322 3441 3456 3469 3481 3507 3508 3596 3744 3799 3847
## [85] 3940 3973 3980 4036 4071 4129 4152 4200 4208 4216 4272 4282 4289 4321
## [99] 4394 4397 4512 4517 4534 4547 4549 4604 4704 4712 4768 4769 4814 4864
## [113] 4884 4947 4980 5048 5063 5079 5088 5108 5198 5301 5368 5389 5395 5406
## [127] 5432 5468 5497 5518 5538 5552 5594 5634 5651 5752 5778 5800 5813 5861
## [141] 5881 6013 6029 6077 6109 6256 6309 6394 6436 6451 6458
#Segundo o site https://vinosdiferentes.com/pt/acidez-do-vinho/
#O valor do ácido cítrico é bem baixo, entre 0,1 e 1 g / litro
#Esse valor zerado pode ter sido a imprecisão dos aparelhos de medição
#Vamos trocá-los por 0.1 que é o valor mais provável
Vinhos[vinhosComZero,"citricacid"] <- 0.1
#Verifica se há valores faltantes no dataset
nVinhosComValoresFaltantes <- length(Vinhos[is.na(Vinhos)]) + length(Vinhos[is.nan(as.matrix(Vinhos))])
paste0("Vinhos com valores faltantes = ",nVinhosComValoresFaltantes)
## [1] "Vinhos com valores faltantes = 0"
Pelos resultados observados de forma tabular, temos que apenas o atributo citricacid possui valores zerados. Conforme pesquisado na Internet (https://vinosdiferentes.com/pt/acidez-do-vinho/) , sabemos que o valor do ácido cítrico deve variar entre 0.1 e 1. Deste modo, muito provavelmente, o valor zerado deve ocorrer por imprecisão dos aparelhos de medição da concentração de ácido cítrico. Fazemos a sua substituição pelo valor mínimo (0.1)
Quanto a existência de valores inválidos ou não inexistentes, isto não foi detectado na amostra.
attach(Vinhos)
boxplot(fixedacidity ~ Vinho, main='fixedacidity',col=c('red','blue'))
boxplot(volatileacidity ~ Vinho , main='volatileacidity')
boxplot(citricacid ~ Vinho, main='citricacid')
boxplot(residualsugar ~ Vinho, main='residualsugar',col=c('red','blue'))
boxplot(chlorides ~ Vinho, main='chlorides')
boxplot(freesulfurdioxide ~ Vinho, main='freesulfurdioxide')
boxplot(totalsulfurdioxide ~ Vinho, main='totalsulfurdioxide')
boxplot(density ~ Vinho, main='density')
boxplot(pH ~ Vinho, main='pH')
boxplot(sulphates ~ Vinho, main='sulphates')
boxplot(alcohol ~ Vinho, main='alcohol')
Quando realizamos a quebra pelo tipo de vinho em boxplotes, percebemos as seguintes características:
fixedacidity - O vinho tinto possui potenciais outliers apenas acima da barreira enquanto o branco possui acima e abaixo das barreiras
citricacid - Há mais potenciais outliers para vinho branco e eles aparecem tanto acima como abaixo das barreiras
residual sugar - Para vinho tinto há mais potenciais outliers. Para vinho branco há menos, mas ficam mais distantes da barreira superior
freesulfurdioxide - Há mais potenciais outliers para o vinho branco e se localizam mais distantes da barreira superior.
totalsufurdioxide - Há potenciais outliers tanto abaixo como acima das barreira para vinhos brancos, para tinto apenas acima e mais próximos
density - Para tinto há um número maior de potenciais outliers, tanto abaixo como acima das barreiras, para branco há poucos e alguns bem distantes
sulphates - Para tinto há mais potenciais outliers e mais distantes da barreira superior
alcohol - Há potenciais outliers acima e abaixo das barreiras apenas para vinhos tintos.
Dividiu-se a amostra entre Vinhos Tintos e Vinhos Brancos
A partir dessa divisão, traçaram-se lado a lado os histogramas dessa subdivisão e percebe-se que o histograma é bem diferente para cada atributo e cada tipo de vinho (tinto e branco)
A percepção visual será complementada com os testes T das médias dos atributos numéricos para a comprovação das diferenças.
for (atr in atributos_numericos){
result <- t.test(VinhosTintos[,atr],VinhosBrancos[,atr])
print(paste0("Teste de igualdade das médias entre tintos e brancos para o atributo ",atr))
print(result)
}
## [1] "Teste de igualdade das médias entre tintos e brancos para o atributo fixedacidity"
##
## Welch Two Sample t-test
##
## data: VinhosTintos[, atr] and VinhosBrancos[, atr]
## t = 32.423, df = 1848.9, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## 1.376241 1.553458
## sample estimates:
## mean of x mean of y
## 8.319637 6.854788
##
## [1] "Teste de igualdade das médias entre tintos e brancos para o atributo volatileacidity"
##
## Welch Two Sample t-test
##
## data: VinhosTintos[, atr] and VinhosBrancos[, atr]
## t = 53.059, df = 1938.9, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## 0.2403544 0.2588044
## sample estimates:
## mean of x mean of y
## 0.5278205 0.2782411
##
## [1] "Teste de igualdade das médias entre tintos e brancos para o atributo citricacid"
##
## Welch Two Sample t-test
##
## data: VinhosTintos[, atr] and VinhosBrancos[, atr]
## t = -11.216, df = 2055.3, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -0.06502621 -0.04567110
## sample estimates:
## mean of x mean of y
## 0.2792308 0.3345794
##
## [1] "Teste de igualdade das médias entre tintos e brancos para o atributo residualsugar"
##
## Welch Two Sample t-test
##
## data: VinhosTintos[, atr] and VinhosBrancos[, atr]
## t = -48.057, df = 6401, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -4.005513 -3.691539
## sample estimates:
## mean of x mean of y
## 2.538806 6.387332
##
## [1] "Teste de igualdade das médias entre tintos e brancos para o atributo chlorides"
##
## Welch Two Sample t-test
##
## data: VinhosTintos[, atr] and VinhosBrancos[, atr]
## t = 34.24, df = 1827.8, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## 0.03930596 0.04408241
## sample estimates:
## mean of x mean of y
## 0.08746654 0.04577236
##
## [1] "Teste de igualdade das médias entre tintos e brancos para o atributo freesulfurdioxide"
##
## Welch Two Sample t-test
##
## data: VinhosTintos[, atr] and VinhosBrancos[, atr]
## t = -54.428, df = 4461.9, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -20.13315 -18.73318
## sample estimates:
## mean of x mean of y
## 15.87492 35.30808
##
## [1] "Teste de igualdade das médias entre tintos e brancos para o atributo totalsulfurdioxide"
##
## Welch Two Sample t-test
##
## data: VinhosTintos[, atr] and VinhosBrancos[, atr]
## t = -89.872, df = 3477, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -93.89760 -89.88813
## sample estimates:
## mean of x mean of y
## 46.46779 138.36066
##
## [1] "Teste de igualdade das médias entre tintos e brancos para o atributo density"
##
## Welch Two Sample t-test
##
## data: VinhosTintos[, atr] and VinhosBrancos[, atr]
## t = 43.15, df = 4252.3, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## 0.002600624 0.002848190
## sample estimates:
## mean of x mean of y
## 0.9967467 0.9940223
##
## [1] "Teste de igualdade das médias entre tintos e brancos para o atributo pH"
##
## Welch Two Sample t-test
##
## data: VinhosTintos[, atr] and VinhosBrancos[, atr]
## t = 27.775, df = 2667.1, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## 0.1141740 0.1315191
## sample estimates:
## mean of x mean of y
## 3.311113 3.188267
##
## [1] "Teste de igualdade das médias entre tintos e brancos para o atributo sulphates"
##
## Welch Two Sample t-test
##
## data: VinhosTintos[, atr] and VinhosBrancos[, atr]
## t = 37.056, df = 2091, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## 0.159395 0.177209
## sample estimates:
## mean of x mean of y
## 0.6581488 0.4898469
##
## [1] "Teste de igualdade das médias entre tintos e brancos para o atributo alcohol"
##
## Welch Two Sample t-test
##
## data: VinhosTintos[, atr] and VinhosBrancos[, atr]
## t = -3.3571, df = 2852.3, p-value = 0.0007979
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -0.18088842 -0.04749554
## sample estimates:
## mean of x mean of y
## 10.40008 10.51427
##
## [1] "Teste de igualdade das médias entre tintos e brancos para o atributo quality"
##
## Welch Two Sample t-test
##
## data: VinhosTintos[, atr] and VinhosBrancos[, atr]
## t = -10.149, df = 2950.8, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -0.2886173 -0.1951564
## sample estimates:
## mean of x mean of y
## 5.636023 5.877909
O p-value de cada um dos testes apresentou valores substancialmente menores que 5%.
Deste modo, para o modelo preditivo a ser desenvolvido, a partir deste ponto, iremos separar a amostras entre os dois tipos de vinho (tinto,branco) e prosseguiremos na criação do modelo preditivo da qualidade apenas para os vinhos brancos
#Selecionar e imprimir potenciais outliers, supondo uma distribuição normal.
#Nesse caso, uma informação é classificada como outlier quando é superior a 1.5 vezes o intervalo interquartil além
#do 3o. quartil ou inferior a 1.5 vezes o intervalor interquartil abaixo do 1 quartil
for (atributo in atributos_numericos){
outliers <- boxplot.stats(VinhosBrancos[,atributo])$out
if (length(outliers) > 0 ){
print(paste0("Potenciais outliers referentes ao atributo ",atributo))
print(paste0("Quantidade de potenciais outliers ",length(outliers)))
print("")
print(outliers)
print("")
}
}
## [1] "Potenciais outliers referentes ao atributo fixedacidity"
## [1] "Quantidade de potenciais outliers 119"
## [1] ""
## [1] 9.3 9.1 9.2 9.2 9.2 9.3 9.2 9.8 8.9 9.2 9.2 4.2 9.8 10.3
## [15] 10.2 9.8 9.0 10.0 8.9 8.9 9.2 9.0 10.0 9.0 9.2 9.8 9.0 4.7
## [29] 8.9 4.7 10.7 8.9 9.6 9.2 8.9 8.9 9.0 9.1 9.8 9.2 9.4 9.0
## [43] 9.6 9.0 9.2 9.6 9.3 9.8 9.2 9.0 9.9 4.7 4.4 9.6 8.9 9.8
## [57] 9.9 8.9 9.4 9.2 8.9 10.0 9.0 4.6 9.0 3.8 9.0 9.2 9.0 9.7
## [71] 9.2 9.7 11.8 9.7 14.2 8.9 8.9 9.7 4.7 9.4 9.5 9.4 9.1 9.4
## [85] 9.0 9.0 9.4 9.6 9.0 9.2 10.7 9.8 9.1 10.3 3.9 9.2 4.4 8.9
## [99] 9.4 9.0 9.2 4.4 8.9 4.2 9.5 9.0 9.4 4.7 9.2 9.2 9.1 9.4
## [113] 9.4 4.5 8.9 8.9 9.1 9.2 9.4
## [1] ""
## [1] "Potenciais outliers referentes ao atributo volatileacidity"
## [1] "Quantidade de potenciais outliers 186"
## [1] ""
## [1] 0.580 0.560 0.510 0.520 0.695 0.670 0.550 0.610 0.640 0.710 0.640
## [12] 0.555 0.540 0.570 0.510 0.520 0.660 0.610 0.595 0.520 0.620 0.580
## [23] 0.490 0.530 0.550 0.520 0.590 0.570 0.510 0.490 0.550 0.560 0.540
## [34] 0.590 0.910 0.660 0.510 0.550 0.640 0.690 0.670 0.510 0.490 0.540
## [45] 0.690 0.580 0.555 0.580 0.600 0.545 0.500 0.610 0.670 0.815 0.650
## [56] 0.530 0.540 0.655 0.600 0.520 0.550 0.560 0.670 0.655 0.500 0.520
## [67] 0.680 0.615 0.490 0.560 0.550 0.490 0.930 0.490 0.685 0.520 0.530
## [78] 0.550 0.760 0.640 0.490 0.560 0.600 0.510 0.580 0.640 0.620 1.005
## [89] 0.560 0.965 0.520 0.500 0.520 0.490 0.560 0.540 0.500 0.530 0.520
## [100] 0.640 0.640 0.600 0.530 0.490 0.530 0.695 0.560 0.610 0.500 0.500
## [111] 0.730 0.500 0.510 0.660 0.600 0.670 0.580 0.780 0.680 0.630 0.615
## [122] 0.530 0.615 0.620 0.500 0.570 0.540 0.490 0.550 0.550 0.500 0.530
## [133] 0.550 0.785 0.570 1.100 0.705 0.600 0.850 0.510 0.500 0.600 0.495
## [144] 0.620 0.660 0.750 0.540 0.905 0.490 0.550 0.510 0.655 0.585 0.705
## [155] 0.680 0.580 0.500 0.540 0.595 0.610 0.540 0.500 0.650 0.610 0.615
## [166] 0.740 0.610 0.495 0.550 0.585 0.590 0.760 0.490 0.510 0.695 0.500
## [177] 0.620 0.540 0.550 0.490 0.630 0.590 0.550 0.490 0.560 0.500
## [1] ""
## [1] "Potenciais outliers referentes ao atributo citricacid"
## [1] "Quantidade de potenciais outliers 251"
## [1] ""
## [1] 0.07 1.00 0.74 0.07 0.09 0.62 0.04 0.07 0.06 0.68 0.59 0.04 0.01 0.07
## [15] 0.71 0.74 0.67 0.02 0.04 0.74 1.00 0.61 0.59 0.64 0.74 0.70 0.58 0.62
## [29] 0.66 0.71 0.88 0.68 0.74 0.04 0.64 0.65 0.01 0.67 0.58 0.62 0.62 0.67
## [43] 0.58 0.72 0.91 0.62 0.71 0.05 0.74 0.58 0.74 0.07 0.05 0.74 0.58 0.72
## [57] 0.65 0.01 0.09 0.09 0.06 0.74 0.72 0.79 0.09 0.08 0.72 0.65 0.81 0.66
## [71] 0.66 0.04 0.74 0.65 0.58 0.05 0.61 0.71 0.58 0.71 0.71 0.09 0.73 0.58
## [85] 0.59 0.74 0.74 0.02 0.82 0.66 0.99 0.74 0.73 0.66 1.66 0.58 0.64 0.74
## [99] 0.79 0.58 0.74 0.71 0.04 0.07 1.00 0.01 0.58 0.74 0.65 0.69 0.01 0.64
## [113] 0.67 0.73 0.09 0.60 0.74 0.74 0.74 0.80 0.60 0.60 0.69 0.06 0.01 1.23
## [127] 0.74 0.63 0.82 0.78 0.69 0.58 0.74 0.58 0.78 0.60 0.04 0.61 0.73 0.74
## [141] 0.65 0.74 0.66 0.65 1.00 0.74 0.61 0.02 0.62 0.61 0.08 0.06 0.68 0.02
## [155] 0.07 0.07 0.06 0.62 0.62 0.74 0.69 0.07 0.91 0.02 1.00 0.04 0.70 0.74
## [169] 0.59 0.68 0.09 0.74 0.74 0.05 0.61 0.08 0.68 0.02 0.71 0.61 0.62 0.07
## [183] 0.67 0.63 0.68 0.62 0.74 0.68 0.58 0.07 0.09 0.74 0.74 0.03 0.69 0.58
## [197] 0.60 0.65 0.74 0.81 0.80 0.67 0.58 0.08 0.74 0.62 0.09 0.09 0.04 0.72
## [211] 0.61 0.74 0.74 0.09 0.67 0.74 0.01 0.06 0.60 0.73 0.74 0.04 0.64 0.62
## [225] 0.63 0.58 0.63 0.04 0.58 0.64 0.74 0.07 0.74 0.59 0.61 0.58 0.74 0.03
## [239] 0.66 0.74 0.58 0.71 0.62 0.70 0.59 0.09 0.58 0.86 0.04 0.62 0.05
## [1] ""
## [1] "Potenciais outliers referentes ao atributo residualsugar"
## [1] "Quantidade de potenciais outliers 7"
## [1] ""
## [1] 26.05 31.60 22.60 45.80 31.60 26.05 23.50
## [1] ""
## [1] "Potenciais outliers referentes ao atributo chlorides"
## [1] "Quantidade de potenciais outliers 208"
## [1] ""
## [1] 0.114 0.014 0.074 0.093 0.172 0.171 0.147 0.123 0.083 0.168 0.074
## [12] 0.092 0.075 0.144 0.126 0.115 0.076 0.346 0.076 0.154 0.087 0.096
## [23] 0.160 0.084 0.076 0.169 0.104 0.072 0.093 0.086 0.108 0.009 0.095
## [34] 0.074 0.152 0.212 0.158 0.092 0.079 0.175 0.142 0.077 0.083 0.096
## [45] 0.084 0.185 0.118 0.173 0.170 0.073 0.076 0.167 0.145 0.088 0.201
## [56] 0.117 0.076 0.094 0.200 0.080 0.137 0.168 0.073 0.080 0.105 0.204
## [67] 0.014 0.157 0.150 0.174 0.290 0.076 0.121 0.180 0.152 0.148 0.110
## [78] 0.122 0.084 0.074 0.119 0.133 0.194 0.170 0.094 0.119 0.083 0.098
## [89] 0.102 0.094 0.208 0.099 0.138 0.088 0.117 0.087 0.135 0.176 0.184
## [100] 0.185 0.078 0.142 0.120 0.211 0.157 0.092 0.082 0.086 0.080 0.149
## [111] 0.208 0.119 0.126 0.123 0.156 0.012 0.244 0.076 0.085 0.110 0.074
## [122] 0.239 0.138 0.098 0.110 0.142 0.076 0.072 0.083 0.096 0.121 0.014
## [133] 0.096 0.073 0.147 0.168 0.184 0.117 0.126 0.083 0.074 0.123 0.136
## [144] 0.085 0.137 0.197 0.074 0.075 0.082 0.074 0.094 0.096 0.081 0.108
## [155] 0.079 0.073 0.098 0.112 0.157 0.160 0.079 0.127 0.078 0.201 0.175
## [166] 0.169 0.084 0.123 0.087 0.271 0.089 0.255 0.097 0.096 0.176 0.081
## [177] 0.132 0.079 0.091 0.240 0.217 0.090 0.086 0.127 0.094 0.073 0.086
## [188] 0.076 0.173 0.167 0.179 0.301 0.090 0.209 0.013 0.014 0.197 0.130
## [199] 0.157 0.095 0.085 0.093 0.172 0.186 0.084 0.146 0.080 0.174
## [1] ""
## [1] "Potenciais outliers referentes ao atributo freesulfurdioxide"
## [1] "Quantidade de potenciais outliers 50"
## [1] ""
## [1] 108.0 81.0 85.0 289.0 101.0 128.0 83.0 81.0 98.0 86.0 97.0
## [12] 96.0 86.0 87.0 96.0 87.0 82.5 81.0 122.5 146.5 88.0 82.0
## [23] 81.0 105.0 98.0 98.0 82.0 105.0 81.0 112.0 101.0 83.0 81.0
## [34] 131.0 83.0 108.0 85.0 87.0 95.0 93.0 124.0 138.5 108.0 110.0
## [45] 81.0 118.5 89.0 96.0 87.0 83.0
## [1] ""
## [1] "Potenciais outliers referentes ao atributo totalsulfurdioxide"
## [1] "Quantidade de potenciais outliers 19"
## [1] ""
## [1] 440.0 9.0 256.0 260.0 19.0 294.0 307.5 256.0 272.0 259.0 18.0
## [12] 303.0 18.0 313.0 344.0 10.0 366.5 272.0 282.0
## [1] ""
## [1] "Potenciais outliers referentes ao atributo density"
## [1] "Quantidade de potenciais outliers 5"
## [1] ""
## [1] 1.00295 1.01030 1.01398 1.01030 1.00295
## [1] ""
## [1] "Potenciais outliers referentes ao atributo pH"
## [1] "Quantidade de potenciais outliers 75"
## [1] ""
## [1] 3.80 3.59 3.57 3.60 3.64 3.63 3.58 2.79 3.82 2.79 3.68 3.65 3.65 3.66
## [15] 3.58 3.69 3.61 3.63 3.60 3.69 3.74 3.59 3.81 3.66 3.63 3.60 3.66 3.60
## [29] 3.57 3.72 2.80 2.77 3.64 3.57 3.63 3.65 3.63 3.59 3.59 3.66 3.68 2.72
## [43] 3.79 3.74 3.75 3.75 3.62 3.59 3.80 2.74 2.79 3.59 3.60 3.61 3.58 3.58
## [57] 3.60 3.57 3.77 3.57 3.58 3.72 3.76 3.65 3.72 3.76 3.60 3.66 3.70 3.61
## [71] 2.80 3.67 3.77 2.80 3.63
## [1] ""
## [1] "Potenciais outliers referentes ao atributo sulphates"
## [1] "Quantidade de potenciais outliers 124"
## [1] ""
## [1] 0.77 0.78 0.78 0.98 0.78 0.79 0.79 0.79 0.86 0.79 0.77 0.82 0.95 0.80
## [15] 0.77 0.79 0.78 0.90 0.88 0.79 0.78 0.78 0.81 0.78 0.78 0.82 0.97 0.78
## [29] 0.78 0.77 0.83 0.81 0.80 0.77 0.88 0.78 0.90 0.79 1.00 0.96 0.82 0.84
## [43] 0.81 0.88 0.82 0.80 0.77 0.98 0.84 0.78 0.79 0.77 0.82 0.88 0.77 0.82
## [57] 0.82 0.98 0.94 0.87 0.82 0.78 0.81 0.79 0.78 0.92 0.82 0.94 0.88 0.88
## [71] 0.79 0.96 0.96 0.77 1.06 0.83 0.85 1.08 0.81 0.95 0.98 0.78 0.79 0.84
## [85] 0.98 0.92 0.80 0.78 0.79 0.90 0.77 0.79 0.86 0.79 0.77 0.82 0.95 0.85
## [99] 0.79 0.77 0.99 0.77 0.95 0.77 0.82 0.77 0.77 0.78 0.89 0.82 0.78 0.80
## [113] 1.01 0.82 0.88 0.85 0.98 0.78 0.79 0.95 0.84 0.87 0.90 0.90
## [1] ""
## [1] "Potenciais outliers referentes ao atributo quality"
## [1] "Quantidade de potenciais outliers 200"
## [1] ""
## [1] 8 8 8 8 8 9 8 8 8 8 8 8 8 3 8 8 8 8 8 8 8 8 3 8 8 8 8 8 8 8 3 8 8 8 8
## [36] 8 3 3 8 8 3 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 8 8 8 8 8 8 8 8 8 8 8 8
## [71] 8 8 3 8 9 8 8 8 9 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 3 3 8 8 3 8 8 8 8 8 3
## [106] 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 3 8 8 3
## [141] 8 8 8 8 3 8 8 8 8 3 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9
## [176] 8 3 8 8 8 8 8 8 8 8 8 8 3 3 8 8 8 3 8 8 8 8 3 8 8
## [1] ""
Há valores potenciais de outliers em quase todos os atributos dos vinhos brancos, exceto na concentração de alchool que não apresenta outliers
Para verificar se os valores são realmente outliers, sabendo-se que os vinhos são portugueses, utilizou-se os valores de referência do Instituto da Vinha e do Vinho de Portugal, com as informações presentes no link a seguir: http://www.ivv.gov.pt/np4/89/
Total Dióxiodo de Enxofre <= 250 mg/L
outAcidezTotal <- which(VinhosBrancos$fixedacidity < 3.5)
outAcidezVolatil <- which(VinhosBrancos$volatileacidity > 0.5)
outAcidoCitrico <- which(VinhosBrancos$citricacid > 1.0)
outAcucar1 <- which(VinhosBrancos$residualsugar > 32)
outAcucar2 <- which(VinhosBrancos$residualsugar < 1)
outCloreto <- which(VinhosBrancos$chlorides > 1)
outTotalSO2 <- which(VinhosBrancos$totalsulfurdioxide > 250)
outVinhoBranco <- unique(c(outAcidezTotal,outAcidezVolatil,outAcidoCitrico,
outAcucar1,outAcucar2,outCloreto,outTotalSO2))
hist(VinhosBrancos[outVinhoBranco,"quality"],main="Qualidade dos vinhos brancos com outliers ")
print("Sumário da qualidade dos vinhos Brancos considerados como outliers ")
## [1] "Sumário da qualidade dos vinhos Brancos considerados como outliers "
summary(VinhosBrancos[outVinhoBranco,"quality"])
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 3.000 5.000 5.000 5.284 6.000 8.000
VinhosBrancosSemOut <- VinhosBrancos[-outVinhoBranco,]
hist(VinhosBrancosSemOut[,"quality"],main="Qualidade dos vinhos brancos sem outliers ")
print("Sumário da qualidade dos vinhos Brancos sem outliers")
## [1] "Sumário da qualidade dos vinhos Brancos sem outliers"
summary(VinhosBrancosSemOut[,"quality"])
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 3.00 5.00 6.00 5.91 6.00 9.00
print("Teste T para a média de qualidade entre os vinhos brancos sem outliers e a amostra completa")
## [1] "Teste T para a média de qualidade entre os vinhos brancos sem outliers e a amostra completa"
print(t.test(VinhosBrancos$quality,VinhosBrancosSemOut$quality))
##
## Welch Two Sample t-test
##
## data: VinhosBrancos$quality and VinhosBrancosSemOut$quality
## t = -1.7793, df = 9533.9, p-value = 0.07523
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -0.067137134 0.003248435
## sample estimates:
## mean of x mean of y
## 5.877909 5.909854
VinhosBrancos <- VinhosBrancosSemOut
Os vinhos brancos selecionados como outliers não possuíam uma distribuição especial em relação à qualidade e não afetavam a média da qualidade dos vinhos. Deste modo, realizou-se um teste T entre os vinhos brancos sem os outliers e a amostra completa, com 95% de confiança e falhou (p-value = 7,5%). Portanto as amostra possuem médias iguais. Por fim, os outliers foram retirados da amostra e do modelo a ser utilizado para predição.
# Gráfico de dispersão ( pch=caracter, lwd=largura)
attach(VinhosBrancos)
#Gráfico de dispersão entre freesulfurdioxide e totalsulfurdioxide
plot(freesulfurdioxide~totalsulfurdioxide,pch=1,lwd=3)
abline(h=mean(freesulfurdioxide), col="red")
abline(v=mean(totalsulfurdioxide), col="green")
Pelo gráfico, pode-se notar uma tendência linear entre as duas variáveis pelo formato do gráfico. Neste, pode-se perceber que, normalmente, quanto maior o indicador totalsulfurdioxide tanto maior o indicador freesulfurdioxide. No entanto, o espalhamento ao redor de uma possível reta mostra que pode não ser a aproximação mais adequada
attach(Vinhos)
Vinhos$fx_redSugar <- cut(residualsugar,breaks=c(0,10,20,30,max(residualsugar)))
CrossTable( Vinhos$fx_redSugar , Vinhos$Vinho)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | Chi-square contribution |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 6497
##
##
## | Vinhos$Vinho
## Vinhos$fx_redSugar | RED | WHITE | Row Total |
## -------------------|-----------|-----------|-----------|
## (0,10] | 1588 | 3705 | 5293 |
## | 62.493 | 20.401 | |
## | 0.300 | 0.700 | 0.815 |
## | 0.993 | 0.756 | |
## | 0.244 | 0.570 | |
## -------------------|-----------|-----------|-----------|
## (10,20] | 11 | 1175 | 1186 |
## | 270.305 | 88.244 | |
## | 0.009 | 0.991 | 0.183 |
## | 0.007 | 0.240 | |
## | 0.002 | 0.181 | |
## -------------------|-----------|-----------|-----------|
## (20,30] | 0 | 15 | 15 |
## | 3.692 | 1.205 | |
## | 0.000 | 1.000 | 0.002 |
## | 0.000 | 0.003 | |
## | 0.000 | 0.002 | |
## -------------------|-----------|-----------|-----------|
## (30,45.8] | 0 | 3 | 3 |
## | 0.738 | 0.241 | |
## | 0.000 | 1.000 | 0.000 |
## | 0.000 | 0.001 | |
## | 0.000 | 0.000 | |
## -------------------|-----------|-----------|-----------|
## Column Total | 1599 | 4898 | 6497 |
## | 0.246 | 0.754 | |
## -------------------|-----------|-----------|-----------|
##
##
Através da análise acima, pode-se verificar que que a quantidade de açúcar restante nos vinhos tintos é muito menor, sendo que 99,3% destes vinhos tem até 10 g/l e apenas 0,7% possuem quantidade até 20g/l. No caso dos vinhos brancos, percebe-se 75,6% possuem até 10g/l de quantidade de açúcar restante, 24% até 20g/l, 0,3% até 30g/l e 0,1% até 45.8g/l
Por esta tabela, pode-se deduzir que os vinhos brancos são normalmente percebidos como mais doces que os vinhos tintos.
#Gráfico da qualidade x concentração residual de açúcar
plot(quality~residualsugar,data=VinhosBrancos,main="qualidade x residualsugar para vinhos brancos")
Aqui traçou-se um gráfico para a quantidade residual de açúcar x qualidade para os vinhos brancos já sem os outliers. Percebe-se que os vinhos brancos de maior qualidade possuem uma concentração de açúcar menor que 20 g/L
## fixedacidity volatileacidity citricacid residualsugar
## fixedacidity 1.0000 -0.0351 0.282 0.079
## volatileacidity -0.0351 1.0000 -0.089 0.072
## citricacid 0.2824 -0.0894 1.000 0.077
## residualsugar 0.0789 0.0724 0.077 1.000
## chlorides 0.0095 0.0461 0.128 0.076
## freesulfurdioxide -0.0559 -0.0715 0.091 0.318
## totalsulfurdioxide 0.0732 0.1110 0.102 0.402
## density 0.2602 -0.0013 0.145 0.836
## pH -0.4122 -0.0541 -0.156 -0.200
## sulphates -0.0217 -0.0405 0.053 -0.052
## alcohol -0.1208 0.0896 -0.092 -0.470
## quality -0.1118 -0.1388 -0.043 -0.119
## chlorides freesulfurdioxide totalsulfurdioxide density
## fixedacidity 0.0095 -0.0559 0.073 0.2602
## volatileacidity 0.0461 -0.0715 0.111 -0.0013
## citricacid 0.1279 0.0914 0.102 0.1449
## residualsugar 0.0763 0.3183 0.402 0.8360
## chlorides 1.0000 0.1178 0.184 0.2501
## freesulfurdioxide 0.1178 1.0000 0.614 0.3188
## totalsulfurdioxide 0.1842 0.6139 1.000 0.5421
## density 0.2501 0.3188 0.542 1.0000
## pH -0.0825 -0.0062 0.010 -0.0959
## sulphates -0.0010 0.0473 0.108 0.0566
## alcohol -0.3629 -0.2662 -0.465 -0.8080
## quality -0.2074 0.0081 -0.181 -0.3261
## pH sulphates alcohol quality
## fixedacidity -0.4122 -0.022 -0.121 -0.1118
## volatileacidity -0.0541 -0.040 0.090 -0.1388
## citricacid -0.1562 0.053 -0.092 -0.0431
## residualsugar -0.1995 -0.052 -0.470 -0.1189
## chlorides -0.0825 -0.001 -0.363 -0.2074
## freesulfurdioxide -0.0062 0.047 -0.266 0.0081
## totalsulfurdioxide 0.0103 0.108 -0.465 -0.1813
## density -0.0959 0.057 -0.808 -0.3261
## pH 1.0000 0.163 0.125 0.1063
## sulphates 0.1627 1.000 -0.019 0.0438
## alcohol 0.1246 -0.019 1.000 0.4409
## quality 0.1063 0.044 0.441 1.0000
Alta correlação negativa entre o volume de alcool e a densidade
## Warning: package 'factoextra' was built under R version 3.5.1
## Welcome! Related Books: `Practical Guide To Cluster Analysis in R` at https://goo.gl/13EFCZ
## [1] "Variância acumulada para cada componente "
## eigenvalue variance.percent cumulative.variance.percent
## Dim.1 3.38909993 28.2424994 28.24250
## Dim.2 1.58636636 13.2197197 41.46222
## Dim.3 1.26219318 10.5182765 51.98050
## Dim.4 1.12079756 9.3399797 61.32048
## Dim.5 1.00233483 8.3527902 69.67327
## Dim.6 0.95095122 7.9245935 77.59786
## Dim.7 0.74903989 6.2419991 83.83986
## Dim.8 0.73434715 6.1195596 89.95942
## Dim.9 0.57112284 4.7593570 94.71877
## Dim.10 0.34436192 2.8696826 97.58846
## Dim.11 0.27531840 2.2943200 99.88278
## Dim.12 0.01406673 0.1172227 100.00000
## [1] "Percentual que cada componente contribui para explicar a variância "
alcohol está isolado no último quadrante, no entanto, está quase alinhado com residualsugar e density.
A partir dessas proximidades entre os atributos, analisa-se os componentes PCA para um subgrupo de atributos percebidos no gráfico.
##
## Loadings:
## RC1 RC2 RC3
## residualsugar 0.733 0.140 -0.035
## freesulfurdioxide 0.605 -0.111 0.451
## totalsulfurdioxide 0.775 -0.081 0.197
## density 0.899 0.197 -0.092
## alcohol -0.807 -0.122 0.215
## fixedacidity 0.070 0.804 -0.037
## citricacid 0.121 0.591 0.281
## pH -0.043 -0.702 0.246
## volatileacidity 0.037 -0.196 -0.520
## quality -0.374 -0.068 0.610
## chlorides 0.366 0.037 -0.280
## sulphates 0.103 -0.131 0.408
##
## RC1 RC2 RC3
## SS loadings 3.270 1.641 1.327
## Proportion Var 0.272 0.137 0.111
## Cumulative Var 0.272 0.409 0.520
## integer(0)
# componentes principais - básico
library(dplyr)
VinhosBrancosNum %>% select(totalsulfurdioxide,freesulfurdioxide) -> df
pca2 <- princomp(df, cor=TRUE)
print(get_eig(pca2))
## eigenvalue variance.percent cumulative.variance.percent
## Dim.1 1.6139443 80.69721 80.69721
## Dim.2 0.3860557 19.30279 100.00000
VinhosBrancosNum %>% select(density,residualsugar,alcohol) -> df2
pca3 <- princomp(df2, cor=TRUE)
print(get_eig(pca3))
## eigenvalue variance.percent cumulative.variance.percent
## Dim.1 2.42132004 80.710668 80.71067
## Dim.2 0.53003882 17.667961 98.37863
## Dim.3 0.04864113 1.621371 100.00000
VinhosBrancosNum$contribso2 = VinhosBrancosNum$totalsulfurdioxide * pca2$loadings[,"Comp.1"][1] + VinhosBrancosNum$freesulfurdioxide * pca2$loadings[,"Comp.1"][2]
VinhosBrancosNum$acucaralcool = VinhosBrancosNum$density * pca3$loadings[,"Comp.1"][1] +
VinhosBrancosNum$residualsugar * pca3$loadings[,"Comp.1"][2] +
VinhosBrancosNum$alcohol * pca3$loadings[,"Comp.1"][3]
acucaralcool:para conter a relação linear proposta pelo primeiro componente entre os atributos density,alcohol e residualsugar. Por fim, os atributos originais foram excluídos do modelo por serem passíveis de substituição sem grandes prejuízos.
library(lattice)
library(latticeExtra)
library(asbio)
library(car)
testa.modelo <- function(modelo=NULL,valores_observados,valores_preditos=NULL,tit_grafico=NULL,sumario=TRUE){
# Testa o modelo
#Exibe um sumário do modelo
if (is.null(modelo)){
fit = valores_preditos
}
else {
#Caso haja modelo....
print("Sumário do modelo....")
if(sumario){
summary(modelo)
}
else {
str(modelo)
}
#Faz as predições do modelo
Val_pred <- predict(modelo,interval = "prediction", level = 0.95)
dimensoes = length(dim(Val_pred))
if (dimensoes > 1) {
# intervalo de confianca - grafico para media
fit <- Val_pred[,1] # valores preditos
lower <- Val_pred[,2] # limite inferior
upper <- Val_pred[,3] # limite superior
}
else {
fit <- Val_pred
}
}
#Calcula a média do quadrado das diferenças entre os valores preditos e os observados
mse <- mean((valores_observados - fit)^2)
print(paste0("MSE para o modelo---> ",sqrt(mse)))
erro_usando_media <- mean((quality - mean(quality))^2)
print(paste0("Erro médio em relação a média para o modelo---> ",sqrt(erro_usando_media)))
# grafico residuo
if (!is.null(modelo)){
rs <- resid(modelo)
plot(predict(modelo), rs, xlab = "Preditor linear",ylab = "Residuos",main=tit_grafico)
abline(h = 0, lty = 2)
}
return (NULL)
}
attach(VinhosBrancosNum)
# Modelo de regressão linear simples
modelo0 <- lm(quality ~ fixedacidity+volatileacidity+citricacid+chlorides+pH+sulphates+contribso2+acucaralcool,
data=VinhosBrancosNum)
modelo1 <- lm(quality ~ fixedacidity+volatileacidity+citricacid+chlorides+pH+sulphates+
totalsulfurdioxide+freesulfurdioxide+density+residualsugar+alcohol,
data=VinhosBrancosNum)
measures <- function(x) {
L <- list(npar = length(coef(x)),
dfres = df.residual(x),
nobs = length(fitted(x)),
RMSE = summary(x)$sigma,
R2 = summary(x)$r.squared,
R2adj = summary(x)$adj.r.squared,
PRESS = press(x),
logLik = logLik(x),
AIC = AIC(x),
BIC = BIC(x))
unlist(L)
}
modl <- list(m1 = modelo0,m2=modelo1)
round(t(sapply(modl, measures)), 3)
## npar dfres nobs RMSE R2 R2adj PRESS logLik AIC BIC
## m1 9 4639 4648 0.825 0.099 0.097 3169.323 -5695.847 11411.69 11476.14
## m2 12 4636 4648 0.742 0.271 0.269 2568.939 -5204.642 10435.28 10519.06
# Modelo de regressão linear com o modelo aplicado o PCA
print("Modelo com regressão linear aplicada sobre o modelo com atributos gerados pelo PCA")
## [1] "Modelo com regressão linear aplicada sobre o modelo com atributos gerados pelo PCA"
result <- testa.modelo(modelo=modelo0,valores_observados=quality,tit_grafico = "Linear com PCA")
## [1] "Sumário do modelo...."
## [1] "MSE para o modelo---> 0.824071443922299"
## [1] "Erro médio em relação a média para o modelo---> 0.868162825258606"
# Modelo com os dados completos sem transformação via PCA
print("Modelo de regressão linear aplicada sobre o modelo com todos os atributos")
## [1] "Modelo de regressão linear aplicada sobre o modelo com todos os atributos"
result <- testa.modelo(modelo=modelo1,valores_observados=quality,tit_grafico = "Linear Completo")
## [1] "Sumário do modelo...."
## [1] "MSE para o modelo---> 0.741426638493799"
## [1] "Erro médio em relação a média para o modelo---> 0.868162825258606"
##### UTILIZANDO FORWARD,BACKWARD OU BOTH
VinhosBrancosStep <- VinhosBrancosNum
VinhosBrancosStep$contribso2 <- NULL
VinhosBrancosStep$acucaralcool <- NULL
modelo.base <- lm(quality ~ fixedacidity,
data=VinhosBrancosStep)
modelo.completo <- lm(quality ~ fixedacidity+volatileacidity+citricacid+chlorides+pH+sulphates+
totalsulfurdioxide+freesulfurdioxide+density+residualsugar+alcohol,
data=VinhosBrancosStep)
modelo.medio <- lm(quality ~ fixedacidity+volatileacidity+citricacid+chlorides+pH+sulphates,
data=VinhosBrancosStep)
forward<-step(modelo.base,direction="forward")
## Start: AIC=-1368.74
## quality ~ fixedacidity
backward<-step(modelo.completo,direction="backward")
## Start: AIC=-2757.17
## quality ~ fixedacidity + volatileacidity + citricacid + chlorides +
## pH + sulphates + totalsulfurdioxide + freesulfurdioxide +
## density + residualsugar + alcohol
##
## Df Sum of Sq RSS AIC
## - totalsulfurdioxide 1 0.001 2555.1 -2759.2
## - chlorides 1 0.029 2555.1 -2759.1
## - citricacid 1 0.059 2555.1 -2759.1
## <none> 2555.1 -2757.2
## - alcohol 1 9.108 2564.2 -2742.6
## - fixedacidity 1 13.387 2568.4 -2734.9
## - freesulfurdioxide 1 16.374 2571.4 -2729.5
## - sulphates 1 20.410 2575.5 -2722.2
## - pH 1 31.939 2587.0 -2701.4
## - density 1 41.409 2596.5 -2684.4
## - residualsugar 1 64.179 2619.2 -2643.9
## - volatileacidity 1 93.457 2648.5 -2592.2
##
## Step: AIC=-2759.17
## quality ~ fixedacidity + volatileacidity + citricacid + chlorides +
## pH + sulphates + freesulfurdioxide + density + residualsugar +
## alcohol
##
## Df Sum of Sq RSS AIC
## - chlorides 1 0.029 2555.1 -2761.1
## - citricacid 1 0.059 2555.1 -2761.1
## <none> 2555.1 -2759.2
## - alcohol 1 9.231 2564.3 -2744.4
## - fixedacidity 1 13.609 2568.7 -2736.5
## - sulphates 1 20.411 2575.5 -2724.2
## - freesulfurdioxide 1 24.975 2580.0 -2716.0
## - pH 1 32.176 2587.2 -2703.0
## - density 1 44.740 2599.8 -2680.5
## - residualsugar 1 67.572 2622.6 -2639.8
## - volatileacidity 1 98.814 2653.9 -2584.8
##
## Step: AIC=-2761.11
## quality ~ fixedacidity + volatileacidity + citricacid + pH +
## sulphates + freesulfurdioxide + density + residualsugar +
## alcohol
##
## Df Sum of Sq RSS AIC
## - citricacid 1 0.070 2555.2 -2763.0
## <none> 2555.1 -2761.1
## - alcohol 1 9.212 2564.3 -2746.4
## - fixedacidity 1 14.342 2569.4 -2737.1
## - sulphates 1 20.611 2575.7 -2725.8
## - freesulfurdioxide 1 24.954 2580.1 -2717.9
## - pH 1 33.472 2588.6 -2702.6
## - density 1 46.560 2601.7 -2679.2
## - residualsugar 1 71.344 2626.4 -2635.1
## - volatileacidity 1 99.914 2655.0 -2584.8
##
## Step: AIC=-2762.99
## quality ~ fixedacidity + volatileacidity + pH + sulphates + freesulfurdioxide +
## density + residualsugar + alcohol
##
## Df Sum of Sq RSS AIC
## <none> 2555.2 -2763.0
## - alcohol 1 9.143 2564.3 -2748.4
## - fixedacidity 1 14.277 2569.4 -2739.1
## - sulphates 1 20.555 2575.7 -2727.8
## - freesulfurdioxide 1 24.913 2580.1 -2719.9
## - pH 1 34.109 2589.3 -2703.3
## - density 1 47.244 2602.4 -2679.8
## - residualsugar 1 72.140 2627.3 -2635.6
## - volatileacidity 1 100.222 2655.4 -2586.2
stepwise<-step(modelo.medio,direction="both")
## Start: AIC=-1664.05
## quality ~ fixedacidity + volatileacidity + citricacid + chlorides +
## pH + sulphates
##
## Df Sum of Sq RSS AIC
## - citricacid 1 0.026 3239.5 -1666.0
## <none> 3239.5 -1664.0
## - sulphates 1 3.034 3242.5 -1661.7
## - pH 1 3.959 3243.4 -1660.4
## - fixedacidity 1 26.753 3266.2 -1627.8
## - volatileacidity 1 57.868 3297.3 -1583.8
## - chlorides 1 133.339 3372.8 -1478.6
##
## Step: AIC=-1666.01
## quality ~ fixedacidity + volatileacidity + chlorides + pH + sulphates
##
## Df Sum of Sq RSS AIC
## <none> 3239.5 -1666.0
## + citricacid 1 0.026 3239.5 -1664.0
## - sulphates 1 3.085 3242.6 -1663.6
## - pH 1 3.937 3243.4 -1662.4
## - fixedacidity 1 27.958 3267.5 -1628.1
## - volatileacidity 1 58.576 3298.1 -1584.7
## - chlorides 1 135.153 3374.7 -1478.0
print("*** Análise dos indicadores para modelos de regressão linear obtidos pelos métodos forward,backward e both ****")
## [1] "*** Análise dos indicadores para modelos de regressão linear obtidos pelos métodos forward,backward e both ****"
modl <- list(m1 = forward,m2=backward,m3=stepwise)
round(t(sapply(modl, measures)), 3)
## npar dfres nobs RMSE R2 R2adj PRESS logLik AIC BIC
## m1 2 4646 4648 0.863 0.013 0.012 3462.576 -5908.858 11823.72 11843.05
## m2 9 4639 4648 0.742 0.271 0.269 2566.095 -5204.733 10429.47 10493.91
## m3 6 4642 4648 0.835 0.075 0.074 3248.967 -5756.220 11526.44 11571.55
##### TESTE DE PREDIÇÃO DOS MODELOS #######
print("Modelo de regressão linear utilizando a estratégia forward nos vinhos brancos com todos os atributos")
## [1] "Modelo de regressão linear utilizando a estratégia forward nos vinhos brancos com todos os atributos"
result<-testa.modelo(modelo=forward,valores_observados=quality,tit_grafico="Linear com forward")
## [1] "Sumário do modelo...."
## [1] "MSE para o modelo---> 0.862716101133199"
## [1] "Erro médio em relação a média para o modelo---> 0.868162825258606"
print("Modelo de regressão linear utilizando a estratégia backward nos vinhos brancos com todos os atributos")
## [1] "Modelo de regressão linear utilizando a estratégia backward nos vinhos brancos com todos os atributos"
result<-testa.modelo(modelo=backward,valores_observados=quality,tit_grafico = "Linear com backward")
## [1] "Sumário do modelo...."
## [1] "MSE para o modelo---> 0.741441077623183"
## [1] "Erro médio em relação a média para o modelo---> 0.868162825258606"
print("Modelo de regressão linear utilizando a estratégia both nos vinhos brancos com todos os atributos")
## [1] "Modelo de regressão linear utilizando a estratégia both nos vinhos brancos com todos os atributos"
result<-testa.modelo(modelo=stepwise,valores_observados=quality,tit_grafico = "Linear com both")
## [1] "Sumário do modelo...."
## [1] "MSE para o modelo---> 0.834845120847508"
## [1] "Erro médio em relação a média para o modelo---> 0.868162825258606"
##### Testa contra os piores modelos
VinhosBrancosModelosRuins <- VinhosBrancosNum
#Utiliza como
VinhosBrancosModelosRuins$qualidade.media <- mean(VinhosBrancosModelosRuins$quality)
valores_preditos <- VinhosBrancosModelosRuins$qualidade.media
print("Modelo Ruim - retorna sempre a média ")
## [1] "Modelo Ruim - retorna sempre a média "
result<-testa.modelo(modelo=NULL,valores_observados=VinhosBrancosModelosRuins$quality,
valores_preditos=valores_preditos,tit_grafico = "Modelo Ruim - Sempre a média")
## [1] "MSE para o modelo---> 0.868162825258606"
## [1] "Erro médio em relação a média para o modelo---> 0.868162825258606"
VinhosBrancosModelosRuins$qualidade.max <- max(VinhosBrancosModelosRuins$quality)
valores_preditos <- VinhosBrancosModelosRuins$qualidade.max
print("Modelo Ruim - retorna sempre o máximo ")
## [1] "Modelo Ruim - retorna sempre o máximo "
result<-testa.modelo(modelo=NULL,valores_observados=VinhosBrancosModelosRuins$quality,
valores_preditos=valores_preditos,tit_grafico = "Modelo Ruim - sempre o máximo")
## [1] "MSE para o modelo---> 3.20978361316982"
## [1] "Erro médio em relação a média para o modelo---> 0.868162825258606"
## Warning: package 'rpart.plot' was built under R version 3.5.1
## Loading required package: rpart
##
## Attaching package: 'rpart.plot'
## The following object is masked from 'package:asbio':
##
## prp
## The following objects are masked from VinhosBrancosNum (pos = 5):
##
## acucaralcool, alcohol, chlorides, citricacid, contribso2,
## density, fixedacidity, freesulfurdioxide, pH, quality,
## residualsugar, sulphates, totalsulfurdioxide, volatileacidity
## The following objects are masked from Vinhos (pos = 14):
##
## alcohol, chlorides, citricacid, density, fixedacidity,
## freesulfurdioxide, pH, quality, residualsugar, sulphates,
## totalsulfurdioxide, volatileacidity
## The following objects are masked from VinhosBrancos:
##
## alcohol, chlorides, citricacid, density, fixedacidity,
## freesulfurdioxide, pH, quality, residualsugar, sulphates,
## totalsulfurdioxide, volatileacidity
## The following objects are masked from Vinhos (pos = 16):
##
## alcohol, chlorides, citricacid, density, fixedacidity,
## freesulfurdioxide, pH, quality, residualsugar, sulphates,
## totalsulfurdioxide, volatileacidity
## The following objects are masked from Vinhos (pos = 18):
##
## alcohol, chlorides, citricacid, density, fixedacidity,
## freesulfurdioxide, pH, quality, residualsugar, sulphates,
## totalsulfurdioxide, volatileacidity
## Warning: labs do not fit even at cex 0.15, there may be some overplotting
## Warning: cex and tweak both specified, applying both
library(rpart)
attach(VinhosBrancosNum)
## The following objects are masked from VinhosBrancosNum (pos = 3):
##
## acucaralcool, alcohol, chlorides, citricacid, contribso2,
## density, fixedacidity, freesulfurdioxide, pH, quality,
## residualsugar, sulphates, totalsulfurdioxide, volatileacidity
## The following objects are masked from VinhosBrancosNum (pos = 6):
##
## acucaralcool, alcohol, chlorides, citricacid, contribso2,
## density, fixedacidity, freesulfurdioxide, pH, quality,
## residualsugar, sulphates, totalsulfurdioxide, volatileacidity
## The following objects are masked from Vinhos (pos = 15):
##
## alcohol, chlorides, citricacid, density, fixedacidity,
## freesulfurdioxide, pH, quality, residualsugar, sulphates,
## totalsulfurdioxide, volatileacidity
## The following objects are masked from VinhosBrancos:
##
## alcohol, chlorides, citricacid, density, fixedacidity,
## freesulfurdioxide, pH, quality, residualsugar, sulphates,
## totalsulfurdioxide, volatileacidity
## The following objects are masked from Vinhos (pos = 17):
##
## alcohol, chlorides, citricacid, density, fixedacidity,
## freesulfurdioxide, pH, quality, residualsugar, sulphates,
## totalsulfurdioxide, volatileacidity
## The following objects are masked from Vinhos (pos = 19):
##
## alcohol, chlorides, citricacid, density, fixedacidity,
## freesulfurdioxide, pH, quality, residualsugar, sulphates,
## totalsulfurdioxide, volatileacidity
print("Modelo de Árvore de regressão com aplicação de PCA - atributos retirados")
## [1] "Modelo de Árvore de regressão com aplicação de PCA - atributos retirados"
result<-testa.modelo(modelo=modelo_Valor_tree ,valores_observados = quality,tit_grafico = "Árvore de Regressão com PCA",
sumario=FALSE)
## [1] "Sumário do modelo...."
## List of 14
## $ frame :'data.frame': 243 obs. of 8 variables:
## ..$ var : Factor w/ 9 levels "<leaf>","acucaralcool",..: 3 9 2 4 3 5 1 7 1 1 ...
## ..$ n : int [1:243] 4648 2875 1783 1642 426 202 19 183 8 175 ...
## ..$ wt : num [1:243] 4648 2875 1783 1642 426 ...
## ..$ dev : num [1:243] 3503 1821 1029 892 178 ...
## ..$ yval : num [1:243] 5.91 5.72 5.54 5.49 5.28 ...
## ..$ complexity: num [1:243] 0.08099 0.04244 0.01209 0.00763 0.00194 ...
## ..$ ncompete : int [1:243] 4 4 4 4 4 4 0 4 0 0 ...
## ..$ nsurrogate: int [1:243] 5 4 1 3 5 0 0 1 0 0 ...
## $ where : Named int [1:4648] 159 79 119 29 238 152 54 63 152 119 ...
## ..- attr(*, "names")= chr [1:4648] "1" "2" "4" "5" ...
## $ call : language rpart(formula = quality ~ fixedacidity + volatileacidity + citricacid + chlorides + pH + sulphates + contrib| __truncated__ ...
## $ terms :Classes 'terms', 'formula' language quality ~ fixedacidity + volatileacidity + citricacid + chlorides + pH + sulphates + contribso2 + acucaralcool
## .. ..- attr(*, "variables")= language list(quality, fixedacidity, volatileacidity, citricacid, chlorides, pH, sulphates, contribso2, acucaralcool)
## .. ..- attr(*, "factors")= int [1:9, 1:8] 0 1 0 0 0 0 0 0 0 0 ...
## .. .. ..- attr(*, "dimnames")=List of 2
## .. .. .. ..$ : chr [1:9] "quality" "fixedacidity" "volatileacidity" "citricacid" ...
## .. .. .. ..$ : chr [1:8] "fixedacidity" "volatileacidity" "citricacid" "chlorides" ...
## .. ..- attr(*, "term.labels")= chr [1:8] "fixedacidity" "volatileacidity" "citricacid" "chlorides" ...
## .. ..- attr(*, "order")= int [1:8] 1 1 1 1 1 1 1 1
## .. ..- attr(*, "intercept")= int 1
## .. ..- attr(*, "response")= int 1
## .. ..- attr(*, ".Environment")=<environment: R_GlobalEnv>
## .. ..- attr(*, "predvars")= language list(quality, fixedacidity, volatileacidity, citricacid, chlorides, pH, sulphates, contribso2, acucaralcool)
## .. ..- attr(*, "dataClasses")= Named chr [1:9] "numeric" "numeric" "numeric" "numeric" ...
## .. .. ..- attr(*, "names")= chr [1:9] "quality" "fixedacidity" "volatileacidity" "citricacid" ...
## $ cptable : num [1:95, 1:5] 0.081 0.0424 0.0148 0.0121 0.0103 ...
## ..- attr(*, "dimnames")=List of 2
## .. ..$ : chr [1:95] "1" "2" "3" "4" ...
## .. ..$ : chr [1:5] "CP" "nsplit" "rel error" "xerror" ...
## $ method : chr "anova"
## $ parms : NULL
## $ control :List of 9
## ..$ minsplit : num 5
## ..$ minbucket : num 2
## ..$ cp : num 0.001
## ..$ maxcompete : int 4
## ..$ maxsurrogate : int 5
## ..$ usesurrogate : int 2
## ..$ surrogatestyle: int 0
## ..$ maxdepth : num 10
## ..$ xval : int 10
## $ functions :List of 2
## ..$ summary:function (yval, dev, wt, ylevel, digits)
## ..$ text :function (yval, dev, wt, ylevel, digits, n, use.n)
## $ numresp : int 1
## $ splits : num [1:906, 1:5] 4648 4648 4648 4648 4648 ...
## ..- attr(*, "dimnames")=List of 2
## .. ..$ : chr [1:906] "chlorides" "acucaralcool" "contribso2" "citricacid" ...
## .. ..$ : chr [1:5] "count" "ncat" "improve" "index" ...
## $ variable.importance: Named num [1:8] 438 349 306 256 198 ...
## ..- attr(*, "names")= chr [1:8] "chlorides" "volatileacidity" "acucaralcool" "contribso2" ...
## $ y : Named int [1:4648] 5 6 6 5 7 6 5 6 6 6 ...
## ..- attr(*, "names")= chr [1:4648] "1" "2" "4" "5" ...
## $ ordered : Named logi [1:8] FALSE FALSE FALSE FALSE FALSE FALSE ...
## ..- attr(*, "names")= chr [1:8] "fixedacidity" "volatileacidity" "citricacid" "chlorides" ...
## - attr(*, "xlevels")= Named list()
## - attr(*, "class")= chr "rpart"
## [1] "MSE para o modelo---> 0.657359505496701"
## [1] "Erro médio em relação a média para o modelo---> 0.868162825258606"
## Warning: labs do not fit even at cex 0.15, there may be some overplotting
## Warning: cex and tweak both specified, applying both
library(rpart)
attach(VinhosBrancosNum)
## The following objects are masked from VinhosBrancosNum (pos = 3):
##
## acucaralcool, alcohol, chlorides, citricacid, contribso2,
## density, fixedacidity, freesulfurdioxide, pH, quality,
## residualsugar, sulphates, totalsulfurdioxide, volatileacidity
## The following objects are masked from VinhosBrancosNum (pos = 4):
##
## acucaralcool, alcohol, chlorides, citricacid, contribso2,
## density, fixedacidity, freesulfurdioxide, pH, quality,
## residualsugar, sulphates, totalsulfurdioxide, volatileacidity
## The following objects are masked from VinhosBrancosNum (pos = 7):
##
## acucaralcool, alcohol, chlorides, citricacid, contribso2,
## density, fixedacidity, freesulfurdioxide, pH, quality,
## residualsugar, sulphates, totalsulfurdioxide, volatileacidity
## The following objects are masked from Vinhos (pos = 16):
##
## alcohol, chlorides, citricacid, density, fixedacidity,
## freesulfurdioxide, pH, quality, residualsugar, sulphates,
## totalsulfurdioxide, volatileacidity
## The following objects are masked from VinhosBrancos:
##
## alcohol, chlorides, citricacid, density, fixedacidity,
## freesulfurdioxide, pH, quality, residualsugar, sulphates,
## totalsulfurdioxide, volatileacidity
## The following objects are masked from Vinhos (pos = 18):
##
## alcohol, chlorides, citricacid, density, fixedacidity,
## freesulfurdioxide, pH, quality, residualsugar, sulphates,
## totalsulfurdioxide, volatileacidity
## The following objects are masked from Vinhos (pos = 20):
##
## alcohol, chlorides, citricacid, density, fixedacidity,
## freesulfurdioxide, pH, quality, residualsugar, sulphates,
## totalsulfurdioxide, volatileacidity
print("Modelo de Árvore de regressão com todos os atributos - sem aplicação de PCA")
## [1] "Modelo de Árvore de regressão com todos os atributos - sem aplicação de PCA"
result<-testa.modelo(modelo=modelo_Valor_tree ,valores_observados = quality,
tit_grafico = "Árvore de Regressão completo",
sumario=FALSE)
## [1] "Sumário do modelo...."
## List of 14
## $ frame :'data.frame': 289 obs. of 8 variables:
## ..$ var : Factor w/ 12 levels "<leaf>","alcohol",..: 2 12 2 7 1 4 8 1 8 1 ...
## ..$ n : int [1:289] 4648 2919 1799 1138 68 1070 340 8 332 320 ...
## ..$ wt : num [1:289] 4648 2919 1799 1138 68 ...
## ..$ dev : num [1:289] 3503.2 1693.1 842.1 424.7 27.8 ...
## ..$ yval : num [1:289] 5.91 5.64 5.44 5.34 4.87 ...
## ..$ complexity: num [1:289] 0.166931 0.049712 0.009901 0.004573 0.000989 ...
## ..$ ncompete : int [1:289] 4 4 4 4 0 4 4 0 4 0 ...
## ..$ nsurrogate: int [1:289] 5 5 5 0 0 5 1 0 0 0 ...
## $ where : Named int [1:4648] 75 271 142 17 238 111 30 82 73 152 ...
## ..- attr(*, "names")= chr [1:4648] "1" "2" "4" "5" ...
## $ call : language rpart(formula = quality ~ fixedacidity + volatileacidity + citricacid + chlorides + pH + sulphates + totalsu| __truncated__ ...
## $ terms :Classes 'terms', 'formula' language quality ~ fixedacidity + volatileacidity + citricacid + chlorides + pH + sulphates + totalsulfurdioxide + fr| __truncated__ ...
## .. ..- attr(*, "variables")= language list(quality, fixedacidity, volatileacidity, citricacid, chlorides, pH, sulphates, totalsulfurdioxide, frees| __truncated__ ...
## .. ..- attr(*, "factors")= int [1:12, 1:11] 0 1 0 0 0 0 0 0 0 0 ...
## .. .. ..- attr(*, "dimnames")=List of 2
## .. .. .. ..$ : chr [1:12] "quality" "fixedacidity" "volatileacidity" "citricacid" ...
## .. .. .. ..$ : chr [1:11] "fixedacidity" "volatileacidity" "citricacid" "chlorides" ...
## .. ..- attr(*, "term.labels")= chr [1:11] "fixedacidity" "volatileacidity" "citricacid" "chlorides" ...
## .. ..- attr(*, "order")= int [1:11] 1 1 1 1 1 1 1 1 1 1 ...
## .. ..- attr(*, "intercept")= int 1
## .. ..- attr(*, "response")= int 1
## .. ..- attr(*, ".Environment")=<environment: R_GlobalEnv>
## .. ..- attr(*, "predvars")= language list(quality, fixedacidity, volatileacidity, citricacid, chlorides, pH, sulphates, totalsulfurdioxide, frees| __truncated__ ...
## .. ..- attr(*, "dataClasses")= Named chr [1:12] "numeric" "numeric" "numeric" "numeric" ...
## .. .. ..- attr(*, "names")= chr [1:12] "quality" "fixedacidity" "volatileacidity" "citricacid" ...
## $ cptable : num [1:108, 1:5] 0.1669 0.0497 0.0262 0.017 0.0099 ...
## ..- attr(*, "dimnames")=List of 2
## .. ..$ : chr [1:108] "1" "2" "3" "4" ...
## .. ..$ : chr [1:5] "CP" "nsplit" "rel error" "xerror" ...
## $ method : chr "anova"
## $ parms : NULL
## $ control :List of 9
## ..$ minsplit : num 5
## ..$ minbucket : num 2
## ..$ cp : num 0.001
## ..$ maxcompete : int 4
## ..$ maxsurrogate : int 5
## ..$ usesurrogate : int 2
## ..$ surrogatestyle: int 0
## ..$ maxdepth : num 10
## ..$ xval : int 10
## $ functions :List of 2
## ..$ summary:function (yval, dev, wt, ylevel, digits)
## ..$ text :function (yval, dev, wt, ylevel, digits, n, use.n)
## $ numresp : int 1
## $ splits : num [1:1200, 1:5] 4648 4648 4648 4648 4648 ...
## ..- attr(*, "dimnames")=List of 2
## .. ..$ : chr [1:1200] "alcohol" "density" "chlorides" "totalsulfurdioxide" ...
## .. ..$ : chr [1:5] "count" "ncat" "improve" "index" ...
## $ variable.importance: Named num [1:11] 815 628 351 343 318 ...
## ..- attr(*, "names")= chr [1:11] "alcohol" "density" "chlorides" "freesulfurdioxide" ...
## $ y : Named int [1:4648] 5 6 6 5 7 6 5 6 6 6 ...
## ..- attr(*, "names")= chr [1:4648] "1" "2" "4" "5" ...
## $ ordered : Named logi [1:11] FALSE FALSE FALSE FALSE FALSE FALSE ...
## ..- attr(*, "names")= chr [1:11] "fixedacidity" "volatileacidity" "citricacid" "chlorides" ...
## - attr(*, "xlevels")= Named list()
## - attr(*, "class")= chr "rpart"
## [1] "MSE para o modelo---> 0.581431041153664"
## [1] "Erro médio em relação a média para o modelo---> 0.868162825258606"